from django.db import models


# Create your models here.


# 用户
class UserInfo(models.Model):
    username = models.CharField(verbose_name='用户名', max_length=32, db_index=True)  # 创建索引
    email = models.EmailField(verbose_name='邮箱', max_length=32)
    mobile_phone = models.CharField(verbose_name='手机号', max_length=32)
    password = models.CharField(verbose_name='密码', max_length=32)

    def __str__(self):
        return self.username


# 会员商品价格表
class CommodityPrices(models.Model):
    category_choices = (
        (1, '免费版'),
        (2, '收费版'),
        (3, '其他')
    )
    category = models.SmallIntegerField(verbose_name='收费版', default=2, choices=category_choices)
    title = models.CharField(verbose_name='标题', max_length=16)
    price = models.PositiveIntegerField(verbose_name='价格')
    p_number = models.PositiveIntegerField(verbose_name='项目个数')
    p_member = models.PositiveIntegerField(verbose_name="项目成员")
    p_space = models.PositiveIntegerField(verbose_name='项目空间', help_text='G')
    file_size = models.PositiveIntegerField(verbose_name='单文件', help_text='M')
    create_datetime = models.DateTimeField(verbose_name='创建时间', auto_now_add=True)


# 交易
class Transaction(models.Model):
    status_choice = (
        (1, '未支付'),
        (2, '已支付'),
    )
    t_status = models.SmallIntegerField(verbose_name='状态', choices=status_choice)
    t_order = models.CharField(verbose_name='订单号', max_length=32, unique=True)  # 唯一索引
    t_user = models.ForeignKey(verbose_name='用户', to='UserInfo', on_delete=models.CASCADE)
    t_price = models.ForeignKey(verbose_name='价格策略', to='CommodityPrices', on_delete=models.CASCADE)
    t_pay = models.IntegerField(verbose_name='实际支付')
    t_start = models.DateTimeField(verbose_name='开始时间', null=True, blank=True)
    t_end = models.DateTimeField(verbose_name='结束时间', null=True, blank=True)
    t_number = models.IntegerField(verbose_name='数量(年)', help_text='0表示无限期')
    create_datetime = models.DateTimeField(verbose_name='创建时间', auto_now_add=True)


# 项目
class Project(models.Model):
    COLOR_CHOICES = (
        (1, '#56b8eb'),
        (2, '#f28033'),
        (3, '#ebc656'),
        (4, '#a2d148'),
        (5, '#20BFA4'),
        (6, '#7461c2'),
        (7, '#20bfa3'),
    )
    p_name = models.CharField(verbose_name='项目名称', max_length=32)
    p_color = models.SmallIntegerField(verbose_name='颜色', choices=COLOR_CHOICES, default=1)
    p_scan = models.TextField(verbose_name='描述', max_length=255, null=True, blank=True)
    user_space = models.BigIntegerField(verbose_name='项目已使用的空间', default=0, help_text='字节')
    star = models.BooleanField(verbose_name='星标', default=False)

    join_count = models.SmallIntegerField(verbose_name='参与人数', default=1)
    creator = models.ForeignKey(verbose_name='创建者', to='UserInfo', on_delete=models.CASCADE)

    create_datetime = models.DateTimeField(verbose_name='创建时间', auto_now_add=True)
    bucket = models.CharField(verbose_name='cos桶', max_length=128)
    region = models.CharField(verbose_name='cos区域', max_length=32)


# 项目参与者
class ProjectUser(models.Model):
    user = models.ForeignKey(verbose_name='用户', to='UserInfo', on_delete=models.CASCADE)
    project = models.ForeignKey(verbose_name='项目', to='Project', on_delete=models.CASCADE)
    # invitee = models.ForeignKey(verbose_name='邀请者', to='UserInfo', related_name='invites', null=True, blank=True)
    star = models.BooleanField(verbose_name='星标', default=False)
    add_datetime = models.DateTimeField('加入时间', auto_now_add=True)


class Wiki(models.Model):
    project = models.ForeignKey(verbose_name='项目', to='Project', on_delete=models.CASCADE)
    title = models.CharField(verbose_name='标题', max_length=32)
    content = models.TextField(verbose_name='内容')
    depth = models.IntegerField(verbose_name='深度', default=1)
    parent = models.ForeignKey(verbose_name='父文章', to='Wiki', null=True, blank=True, related_name='children',
                               on_delete=models.CASCADE)  # 自己关联自己，related_name为了更好的实现反向关联

    # 让标题以中文的形式显示出来

    def __str__(self):
        return self.title


class FileRepository(models.Model):
    """文件库"""
    project = models.ForeignKey(verbose_name="项目", to='Project', on_delete=models.CASCADE)
    file_type_choices = (
        (1, '文件'),
        (2, '文件夹')
    )
    file_type = models.SmallIntegerField(verbose_name='类型', choices=file_type_choices)
    name = models.CharField(verbose_name='文件夹名称', max_length=128, help_text="文件/文件夹")
    key = models.CharField(verbose_name='文件储存在COS中的KEY', max_length=128, null=True, blank=True)
    file_size = models.BigIntegerField(verbose_name='文件大小', null=True, blank=True, help_text='字节')
    file_path = models.CharField(verbose_name='文件路径', max_length=255, null=True, blank=True)
    parent = models.ForeignKey(verbose_name='父级目录', to='self', related_name='child', null=True, blank=True,
                               on_delete=models.CASCADE)
    update_user = models.ForeignKey(verbose_name='最近更新者', to='UserInfo', on_delete=models.CASCADE)
    update_datetime = models.DateTimeField(verbose_name='更新时间', auto_now=True)


# 问题创建
class Issues(models.Model):
    project = models.ForeignKey(verbose_name='项目', to='Project', on_delete=models.CASCADE)
    issues_type = models.ForeignKey(verbose_name='问题类型', to='IssuesType', on_delete=models.CASCADE)
    module = models.ForeignKey(verbose_name='模块', to='Module', null=True, blank=True, on_delete=models.CASCADE)
    subject = models.CharField(verbose_name='主题', max_length=80)
    desc = models.TextField(verbose_name='问题描述')
    priority_choices = (
        ('danger', '高'),
        ('warning', '中'),
        ('success', '低'),

    )
    priority = models.CharField(verbose_name='优先级', max_length=12, choices=priority_choices, default='danger')
    status_choices = (
        (1, '新建'),
        (2, '处理中'),
        (3, '已解决'),
        (4, '已忽略'),
        (5, '待反馈'),
        (6, '已关闭'),
        (7, '重新打开'),
    )
    status = models.SmallIntegerField(verbose_name='状态', choices=status_choices, default=1)
    assign = models.ForeignKey(verbose_name='指派', to='UserInfo', related_name='task',
                               null=True, blank=True, on_delete=models.CASCADE)
    attention = models.ManyToManyField(verbose_name='关注者', to='UserInfo', related_name='observe', blank=True)
    start_time = models.DateField(verbose_name='开始时间', null=True, blank=True)
    end_time = models.DateField(verbose_name='结束时间', null=True, blank=True)
    mode_choices = (
        (1, '公开模式'),
        (2, '隐私模式')
    )
    mode = models.SmallIntegerField(verbose_name='模式', choices=mode_choices, default=1)
    parent = models.ForeignKey(verbose_name='父问题', to='self', related_name='child', null=True, blank=True,
                               on_delete=models.SET_NULL)
    creator = models.ForeignKey(verbose_name='创建者', to='UserInfo',
                                related_name='creator_problems', on_delete=models.CASCADE)
    creator_datetime = models.DateTimeField(verbose_name='创建时间', auto_now_add=True)
    latest_update_datetime = models.DateTimeField(verbose_name='最后创建时间', auto_now=True)

    def __str__(self):
        return self.subject


# 问题类型
class IssuesType(models.Model):
    PROJECT_INIT_LIST = ["任务", "功能", "BUG"]
    """ 问题类型,例如：任务，功能，BUG"""
    title = models.CharField(verbose_name='类型名称', max_length=32)
    project = models.ForeignKey(verbose_name='项目', to='Project', on_delete=models.CASCADE)

    def __str__(self):
        return self.title


# 模块
class Module(models.Model):
    """模块（阶段式的任务）"""
    project = models.ForeignKey(verbose_name='项目', to='Project', on_delete=models.CASCADE)
    title = models.CharField(verbose_name='模块名称', max_length=32)

    def __str__(self):
        return self.title


# 问题回复
class IssuesReply(models.Model):
    """ 问题回复"""

    reply_type_choices = (
        (1, '修改记录'),
        (2, '回复')
    )
    reply_type = models.IntegerField(verbose_name='类型', choices=reply_type_choices)

    issues = models.ForeignKey(verbose_name='问题', to='Issues', on_delete=models.CASCADE)
    content = models.TextField(verbose_name='描述')
    creator = models.ForeignKey(verbose_name='创建者', to='UserInfo', related_name='create_reply',
                                on_delete=models.CASCADE)
    create_datetime = models.DateTimeField(verbose_name='创建时间', auto_now_add=True)

    reply = models.ForeignKey(verbose_name='回复', to='self', null=True, blank=True, on_delete=models.CASCADE)


# 项目邀请码
class ProjectInvite(models.Model):
    project = models.ForeignKey(verbose_name='项目', to='Project', on_delete=models.CASCADE)
    code = models.CharField(verbose_name='邀请码', max_length=64, unique=True)
    count = models.PositiveIntegerField(verbose_name='限制数量', null=True, blank=True, help_text='空表示无数量的限制')
    user_count = models.PositiveIntegerField(verbose_name='已邀请数量', default=0)
    period_choices = (
        (30, '30分钟'),
        (60, '1个小时'),
        (300, '5个小时'),
        (1440, '24小时'),
    )
    period = models.IntegerField(verbose_name='有效期', choices=period_choices, default=1440)
    create_datetime = models.DateTimeField(verbose_name='创建时间', auto_now_add=True)
    creator = models.ForeignKey(verbose_name='创建者', to='UserInfo', on_delete=models.CASCADE,
                                related_name='create_invite')


# 游戏充值
class GameTransaction(models.Model):
    status = (
        (1, '未支付'),
        (2, '已支付'),
    )
    g_status = models.SmallIntegerField(verbose_name='状态', choices=status)
    g_order = models.CharField(verbose_name='订单号', max_length=32, unique=True)  # 唯一索引
    g_user = models.ForeignKey(verbose_name='用户', to='UserInfo', on_delete=models.CASCADE)
    g_pay = models.IntegerField(verbose_name='价格')
    create_datetime = models.DateTimeField(verbose_name='创建时间', auto_now_add=True)


class CrawlDate(models.Model):
    project = models.ForeignKey(verbose_name='项目内容', to='Project', on_delete=models.CASCADE)
    serial = models.IntegerField("序号")
    fund_code = models.CharField(verbose_name="基金代码", max_length=64, db_index=True)
    fund_name = models.CharField(verbose_name="基金名称", max_length=64, db_index=True)
    f_datetime = models.CharField(verbose_name="日期", max_length=32, blank=True)
    f_value = models.CharField(verbose_name="单位净值", max_length=32, blank=True)
    f_net_value = models.CharField(verbose_name="累计净值", max_length=32, blank=True)
    day_growth = models.CharField(verbose_name="日增长率", max_length=32, blank=True)
    week = models.CharField(verbose_name="这一周", max_length=32, blank=True)
    january = models.CharField(verbose_name="近一月", max_length=32, blank=True)
    march = models.CharField(verbose_name="近三月", max_length=32, blank=True)
    six_month = models.CharField(verbose_name="近六月", max_length=32, blank=True)
    year = models.CharField(verbose_name="近三月", max_length=32, blank=True)
